iT邦幫忙

2022 iThome 鐵人賽

DAY 29
0
Mobile Development

從零開始的IOS開發日常系列 第 29

[鐵人賽 Day 29] Swift 仿刻 IOS 內建的 Clock - 計時器 (3) 所有功能完成!

  • 分享至 

  • xImage
  •  

上次介紹到了把 PickerView 設定好後呈現出來和累加值的部分,今天要來介紹如何把值拿來計時以及通知!

按下 “Start” 的功能

當我們按下 “Start” 的時候,原本是 PickerView 的位置要變成顯示時間的 Label ,然後一些像是 “Start” 的按鈕要改成 “Stop” 這邊我們利用了 .isHidden 來設定他們按鈕的狀態為隱藏或顯示

start_status = true
start.isHidden = true
stop.isHidden = false
pickerview.isHidden = true
label.isHidden = false

再來我們要設定顯示的時間以及格式!
我們在上一篇有講到我們是利用秒為單位,其他像是分或時的,我們直接把數字乘上去並累加起來轉換為秒的單位即可,這邊就是要把它轉回來,並分別放到對應的單位變數顯示出來即可!

let second_label =  second_count % 60
let minute_label = ( second_count / 60 ) % 60
let hour_label = second_count / 3600
        //轉換單位
second_count -= 1
let showHours = hour_label > 9 ? "\(hour_label)" : "0\(hour_label)"
let showMinutes = minute_label > 9 ? "\(minute_label)" : "0\(minute_label)"
let showSeconds = second_label > 9 ? "\(second_label)" : "0\(second_label)"
        //如果是個位數,則前面要補零
label.text = "\(showHours):\(showMinutes):\(showSeconds)"
       //把結果顯示在 Label 裡

最後我們還要寫一個函式,每秒去更動儲存秒的值以及變更 Label 的內容!

 timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(count_down), userInfo: nil, repeats: true) //每隔一秒去執行名叫 “count_down” 的函式

以上的程式碼都寫在 Start 的 IBAction 喔!

count_down fuction 撰寫

每秒被 Start 呼叫到之後,要每秒去更新 Label 的內容
並且要每秒去將 “second_count” -1 從而達成計算時間的方法

 @objc func count_down() {
        
        let second_label =  second_count % 60
        let minute_label = ( second_count / 60 ) % 60
        let hour_label = second_count / 3600
        
        let showHours = hour_label > 9 ? "\(hour_label)" : "0\(hour_label)"
        let showMinutes = minute_label > 9 ? "\(minute_label)" : "0\(minute_label)"
        let showSeconds = second_label > 9 ? "\(second_label)" : "0\(second_label)"
        second_count -= 1    //每秒 -1
        label.text = "\(showHours):\(showMinutes):\(showSeconds)"
        
        
        if second_count <= -1 {
            start.isEnabled = false
            stop.isEnabled = false
            timer.invalidate()     //當時間到了會暫停 Timer 的進程
            label.text = "00:00:00"
            creatnotifaction()     //當時間到的時候呼叫 ”creatnotifaction“ 進行系統通知的動作
        }
    }

creatnotifaction fuction 撰寫

當我們時間到了之後, ”count_down“ fuction 就會去呼叫這個 fuction 讓系統去建立一個 notifaction 去通知時間到了!
以下就是 notifaction 的基本設定!

func creatnotifaction() {
    let content = UNMutableNotificationContent()
    content.title = "Timer"
    content.subtitle = "Time up"
    content.body = ""
    content.sound = UNNotificationSound.default
    let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 0.001, repeats: false)     //0.001 秒後系統會發通知,因為不能用 0 所以我用極小值 0.001 代替
    let request = UNNotificationRequest(identifier: "notification", content: content, trigger: trigger)
    UNUserNotificationCenter.current().add(request,withCompletionHandler: {error in print("成功建立通知...\(second_count)")
    })  // 這邊如果成功建立通知的話,會 print 出 second_count 的值,可以讓我們去檢查哪裡出錯
}

按下 “Stop” 的功能

按下 “Stop” 之後就是要將 “start” 的按鈕顯示出來,並把自己隱藏,還需要將 timer 暫停!

@IBAction func stop(_ sender: Any) {
        start_status = false
        start.isHidden = false
        stop.isHidden = true
        pickerview.isHidden = true
        label.isHidden = false
        timer.invalidate()
        
    }

按下 “Cancel” 的功能

這邊我們需要把按鈕設為隱藏或顯示,還需要將上一次計算到的時間存放到 second_count,因為 pickerview 如果將畫面切回去他是不會再讀取一次值的,需要再滾動一次才會再去讀取,所以我們需要先將上次使用的值先存起來,再把 timer 暫停即可!

@IBAction func cancel(_ sender: Any) {
        start_status = false
        start.isHidden = false
        stop.isHidden = true
        pickerview.isHidden = false
        label.isHidden = true
        second_count = reload_count
        timer.invalidate()
        start.isEnabled = true
        stop.isEnabled = true
    }

如此一來!計時器的所有功能就設定完畢囉!


上一篇
[鐵人賽 Day 28] Swift 仿刻 IOS 內建的 Clock - 計時器 (2) PickerView 設定
下一篇
[鐵人賽 Day 30] 鐵人賽結語
系列文
從零開始的IOS開發日常30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言